//
//  CZStatusPictureView.swift
//  czbkiosweibo5
//
//  Created by zhangping on 15/10/18.
//  Copyright © 2015年 zhangping. All rights reserved.
//

import UIKit
import SDWebImage

/// cell的重用标示
private let CZStatusPictureViewCellIdentifier = "cellId"

/// 微博配图视图
class CZStatusPictureView: UICollectionView {
    
    // MARK: 属性
    /// 微博模型
    var status: CZStatus? {
        didSet {
            // 调用sizeToFit,会调用view的sizeThatFits来重新计算view的size
            sizeToFit()
            
            // 刷新数据
            reloadData()
        }
    }
    
    /**
    调用view的sizeToFit,会调用view的sizeThatFits来重新计算view的size,并将返回的size设置为view的宽高
    - parameter size: 之前view的宽高
    - returns: 计算好的size
    */
    override func sizeThatFits(size: CGSize) -> CGSize {
        return calcViewSize()
    }
    
    /// 计算配图宽高
    func calcViewSize() -> CGSize {
        // 准备常量
        // 每个item的大小
        let itemSize = CGSize(width: 90, height: 90)
        // 设置布局的itemSize
        pictureLayout.itemSize = itemSize
        pictureLayout.minimumInteritemSpacing = 0
        pictureLayout.minimumLineSpacing = 0
        
        // cell之间的间距
        let margin: CGFloat = 10
        
        // 最大列数
        let column = 3
        
        // 获取配图的数量
        let count = status?.pictureURLs?.count ?? 0
        
        // 根据配图数量计算配图尺寸
        
        // 没有图片
        if count == 0 {
            return CGSizeZero
        }
        
        // 1张图片,返回真实图片大小,需要获取到图片
        if count == 1 {
            // 获取图片url地址
            let urlString = status!.pictureURLs![0].absoluteString
            
            var size = CGSize(width: 150, height: 120)
            
            // 获取图片, 有图片设置size为图片的size,如果没有图片使用默认的
            if let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(urlString) {
                size = image.size
            }
            
            // 有些图片宽度很小
            if size.width < 40 {
                size.width = 40
            }
            
            pictureLayout.itemSize = size
            return size
        }
        
        // 超过一张图片设置间距
        pictureLayout.minimumInteritemSpacing = margin
        pictureLayout.minimumLineSpacing = margin
        
        // 4张图片
        if count == 4 {
            let width = 2 * itemSize.width + margin
            return CGSize(width: width, height: width)
        }
        
        // 其他图片: 2, 3, 5, 6, 7, 8, 9
        // 公式: 行数 = (图片数量 + 列数 - 1) / 列数
        let row = (count + column - 1) / column
        
        // 计算宽度
        let width = (CGFloat(column) * itemSize.width) + (CGFloat(column) - 1) * margin
        
        // 计算高度
        let height = (CGFloat(row) * itemSize.height) + (CGFloat(row) - 1) * margin
        
        return CGSize(width: width, height: height)
    }
    
    /// collectionView的布局
    private var pictureLayout = UICollectionViewFlowLayout()
    
    // MARK: - 构造函数
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: pictureLayout)
        
        // 设置背景
        backgroundColor = UIColor(white: 0.9, alpha: 1)
        
        // 注册cell
        registerClass(CZStatusPictureViewCell.self, forCellWithReuseIdentifier: CZStatusPictureViewCellIdentifier)
        
        // 设置自己为自己的数据源
        dataSource = self
        
        // 设置自己成为自己的代理
        delegate = self
    }
}

// MARK: - 扩展数据源方法
extension CZStatusPictureView: UICollectionViewDataSource, UICollectionViewDelegate {
    
    // 返回图片张数
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return status?.pictureURLs?.count ?? 0
    }
    
    // 返回cell
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(CZStatusPictureViewCellIdentifier, forIndexPath: indexPath) as! CZStatusPictureViewCell
        
//        let urlString = status?.pic_urls?[indexPath.row]["thumbnail_pic"]
//        cell.imageURL = NSURL(string: urlString as! String)
        cell.imageURL = status?.pictureURLs?[indexPath.row]
        
        return cell
    }
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        // 需要将cell的点击时间传递给控制器
        /*
            代理:
                1. 1对1
                2. 可以有返回值
                3. 层次嵌套不要太深
        
            通知:
                1. 一对多
                2. 不能接受返回值
                3. 层次嵌套无所谓
                注意:
                    1.通知是同步的
                    2.在哪个线程发送的通知就再哪个线程接收
        */
        
        /*
            需要传递哪些参数
                1.所有大图的url
                2.点击了哪个cell
        */
        
        NSNotificationCenter.defaultCenter().postNotificationName(CZStatusPictureViewCellSelectedPictureNotification, object: self, userInfo: [CZStatusPictureViewCellSelectedPictureURLKey : status!.largePictureURLs!, CZStatusPictureViewCellSelectedPictureIndexPathKey: indexPath])
    }
}

// MARK: - 通知常量
/// cell点击发送通知的名称
let CZStatusPictureViewCellSelectedPictureNotification = "CZStatusPictureViewCellSelectedPictureNotification"

/// 通知中url对应的key
let CZStatusPictureViewCellSelectedPictureURLKey = "CZStatusPictureViewCellSelectedPictureURLKey"

/// 通知中点击cell的indexPath
let CZStatusPictureViewCellSelectedPictureIndexPathKey = "CZStatusPictureViewCellSelectedPictureIndexPathKey"

/// 自定义cell
class CZStatusPictureViewCell: UICollectionViewCell {
    
    // MARK: - 属性
    /// 显示图片的URL
    var imageURL: NSURL? {
        didSet {
            /// 加载图片
            iconView.cz_setImageWithURL(imageURL)
            
            // url地址,以gif结尾的为gif图片,显示gif图标
            let gif = (imageURL!.absoluteString as NSString).pathExtension.lowercaseString == "gif"
            gifImageView.hidden = !gif
        }
    }
    
    // MARK: - 构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        // 准备UI
        prepareUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - 准备UI
    /// 准备UI
    private func prepareUI() {
        // 添加子控件
        contentView.addSubview(iconView)
        contentView.addSubview(gifImageView)
        
        // 添加约束
        iconView.ff_Fill(contentView)
        
        // git图标
        // 在父控件右下角
        gifImageView.ff_AlignInner(type: ff_AlignType.BottomRight, referView: contentView, size: nil)
    }
    
    // MARK: - 懒加载控件
    // 图片
    private lazy var iconView: UIImageView = {
        let imageView = UIImageView()
        
        // 设置imageView的contentMode
        imageView.contentMode = UIViewContentMode.ScaleAspectFill
        
        // 设置imageView的clipsToBounds
        imageView.clipsToBounds = true
        
        return imageView
    }()
    
    // gif图标
    private lazy var gifImageView: UIImageView = UIImageView(image: UIImage(named: "timeline_image_gif"))
}